package cn.hyh.core.component;

import cn.hyh.core.pojo.User;
import cn.hyh.core.util.HttpUtils;
import com.alibaba.fastjson.JSON;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.web.filter.AccessControlFilter;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

/**
 * @auther :hyh
 * @desc :         用于判断是否登录的过滤器。  暂时未用。
 * @date :2019/7/23
 */
public class ShiroLoginFilter extends AccessControlFilter {

    /**
     *   登录拦截 ，返回true,继续进入下一个拦截器， 返回false  进入onAccessDenied  方法。
     * @param request
     * @param response
     * @param mappedValue
     * @return
     * @throws Exception
     */
    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {

        User user= (User) SecurityUtils.getSubject().getPrincipal();
        if (user != null || isLoginRequest(request, response)) {
              //说明是登录过，或者是要登录请求。
            return true;
        }
        HttpServletRequest req = (HttpServletRequest) request;
        if (RequestMethod.OPTIONS.name().equalsIgnoreCase(req.getMethod())) {
            return  true;
        }
        if (HttpUtils.isAjax(request)) {
           //ajax 请求 返回的数据，无法实现重定向或者forward，可以通过response 返回json ，判断json 重定向。
            Map<String, String> map = new HashMap<>();
            map.put("code", "-2");
            map.put("message", "请先登录!");
            String s = JSON.toJSONString(map);
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json; charset=utf-8");
            PrintWriter writer = response.getWriter();
            writer.write(s);
        }


        return false;
    }

    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
        //保存登陆后的连接。

        saveRequestAndRedirectToLogin(request,response);
        return false;
    }
}
